package com.test.aop;

/**
 * 单例目标源类，用于管理单例对象的生命周期
 * 在AOP（面向切面编程）中，此类用于提供目标对象（被代理的对象），确保每次请求都返回相同的实例
 */
public class SingletonTargetSource implements TargetSource{

    // 保存单例对象引用
    private final Object target;

    /**
     * 构造方法，初始化单例目标源
     * @param target 目标对象，不能为空
     * @throws IllegalArgumentException 如果目标对象为null，则抛出此异常
     */
    public SingletonTargetSource(Object target) {
        if (target == null){
            throw new IllegalArgumentException("目标类不能为空");
        }
        this.target = target;
    }

    /**
     * 获取目标对象的类
     * @return 目标对象的类
     */
    @Override
    public Class<?> getTargetClass() {
        return target.getClass();
    }

    /**
     * 判断目标源是否是静态的
     * 对于单例目标源，总是返回true，表示其生命周期是静态的
     * @return 总是返回true
     */
    @Override
    public boolean isStatic() {
        return true;
    }

    /**
     * 获取目标对象
     * @return 单例对象
     * @throws Exception 如果获取目标对象时发生错误，则抛出此异常
     */
    @Override
    public Object getTarget() throws Exception {
        return  this.target;
    }

    /**
     * 释放目标对象
     * 对于单例目标源，此方法不需要执行任何操作，因为单例对象不会被释放
     * @param target 目标对象
     * @throws Exception 如果释放目标对象时发生错误，则抛出此异常
     */
    @Override
    public void releaseTarget(Object target) throws Exception {
        // 单例不需要释放
    }

    /**
     * 重写equals方法，比较两个SingletonTargetSource对象是否相等
     * @param obj 要比较的另一个对象
     * @return 如果两个对象相等，则返回true；否则返回false
     */
    @Override
    public boolean equals(Object obj) {
        if (this == obj){
            return true;
        }
        if (!(obj instanceof SingletonTargetSource)){
            return false;
        }
        SingletonTargetSource other = (SingletonTargetSource) obj;
        return this.target.equals(other.target);
    }

    @Override
    public int hashCode() {
        return this.target.hashCode();
    }
}
